//
//  NetworkHandler.m
//  UI18 - 网络请求
//
//  Created by hesiyao on 15/12/30.
//  Copyright © 2015年 www.lanou3g.com蓝鸥科技. All rights reserved.
//

#import "NetworkHandler.h"

@implementation NetworkHandler

//GET
+(void)GETWithURL:(NSString *)Str completion:(NETBLOCK)netBlock
{
    // 中文转码
    NSString *urlStr = [Str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:Str]];
    // str -> url
    NSURL *url = [NSURL URLWithString:urlStr];
    //  参数1 : url
    //  参数2 : 缓存
    //  参数3 : 超时限制
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    // 进行连接 session
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            // JSON 解析中Data不能为nil
            if (error) {
                NSLog(@"错误信息%@",error);
            }
            else
            {
                // JSON 解析
                NSError *jError = nil;
                id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jError];
                if (jError) {
                    NSLog(@"解析错误%@", jError);
                }else
                {
                    // 向外部返回JSON数据
                    netBlock(result);
                }
            }
        });
    }];
    [task resume];
}

+ (void)POETWithURL:(NSString *)Str body:(NSData *)body completion:(NETBLOCK)netBlock
{
    // 中文转码
    NSString *urlStr = [Str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:Str]];
    // str -> url
    NSURL *url = [NSURL URLWithString:urlStr];
    //  参数1 : url
    //  参数2 : 缓存
    //  参数3 : 超时限制
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    // POST
    request.HTTPMethod = @"POST";
    // body
    request.HTTPBody = body;
    // 进行连接 session
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            // JSON 解析中Data不能为nil
            if (error) {
                NSLog(@"错误信息%@",error);
            }
            else
            {
                // JSON 解析
                NSError *jError = nil;
                id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jError];
                if (jError) {
                    NSLog(@"解析错误%@", jError);
                }else
                {
                    // 向外部返回JSON数据
                    netBlock(result);
                }
            }
        });
    }];
    [task resume];
    
}

// 封装
// 把重复的代码只写一次 以后反复使用 要一次写成考虑多反面

//封装的原因
// 1. 简化代码(偷懒)
// 2. 提高代码的扩展性 和可重用性

// 封装的标志
// 凡是想要复制粘贴/重复出现的代码

//封装的方式:
// 1.方法封装(自适应cell高度)
// 重复代码写在一个方法中 当前类/相关联类中使用
// 2.类封装(网络请求 / Model类)
// 把重复代码写在类中 多个类/多个工程中都可以使用
// 3.类目封装(字符串倒序/ 获取拼音)
// 已经存在的类(已经存在的了)写扩展

// 封装的要求
// 1. 内存管理
// 2. 返回值和参数 那些是必须得 那些是可选的
// 3. 安全性 自身保证不会出问题
// 4. 扩展性 封装是一个可以长期提高优化的方式

@end
